home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / sharew / accs / player / player.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-07-19  |  3.8 KB  |  176 lines

  1. /*     MUSIC-Player C-Sourcekode - written by MABA
  2.        -------------------------------------------
  3.  
  4.        spielt auf Wunsch ein Musikstück ab.
  5. */
  6.  
  7. #define   state(x)       *(zeiger + (x * 12) + 5)
  8.  
  9. #define       PRG    4
  10. #define       AGAIN  5
  11.  
  12.  
  13. char pathname[66] = "A:*.SNG";
  14. char filename[14] = 0;
  15.  
  16. long speicher = 0;
  17.  
  18. extern long   gemdos();
  19. extern long   bios();
  20. extern long   xbios();
  21.  
  22. extern int gl_apid;
  23. int id,index;
  24.  
  25. int *zeiger;
  26.  
  27. struct DTA {
  28.        char   shit1[26];
  29.        unsigned int h_len;
  30.        unsigned int l_len;
  31.        char   shit2[20];
  32. } dta;
  33.  
  34.  
  35. /******************  Programmteil ******************/
  36. main()
  37. {
  38.  
  39.        appl_init();
  40.        id = menu_register(gl_apid,"  Music-Player 1.0");
  41.  
  42.        if (!rsrc_load("player.rsc")) {    /* Fehler beim Laden */
  43.               form_alert(1,"[1][Kann PLAYER.RSC nicht nachladen!][ABBRUCH]");
  44.               return;
  45.        }
  46.  
  47.        rsrc_gaddr(1,0,&zeiger);  /* Startadr. holen */
  48.  
  49.  
  50.        state(AGAIN) = 8|32;    /* DISABLED /*
  51.  
  52.        gemdos(0x48,(long) 5);      /* 5 Bytes belegen */
  53.  
  54.        multi();
  55. }
  56.  
  57.  
  58. /***** Acc-Handle-Routine *****/
  59. multi()
  60. {
  61. int event,msgbuff[8],mx,my,ret;
  62.  
  63.        while (1) {
  64.  
  65.             event = evnt_multi(16,1,1,1,0,0,0,0,0,0,0,0,0,0,msgbuff,0,0,
  66.                                &mx,&my,&ret,&ret,&ret,&ret);
  67.  
  68.               if ((event & 16) && (msgbuff[0] == 40) && (msgbuff[4] == id))
  69.                    opn_form();
  70.  
  71.        }
  72. }
  73.  
  74.  
  75. /***** verwaltet Formular *****/
  76. opn_form()
  77. {
  78. int    x,y,w,h;
  79.  
  80.      form_center (zeiger, &x,&y,&w,&h);
  81.      form_dial (0, x,y,w,h, x,y,w,h);
  82.      form_dial (1, 10,10,20,20, x,y,w,h);
  83.      objc_draw (zeiger,0,1, x,y,w,h);
  84.      index = form_do (zeiger,0);
  85.      state(index) = 32;     /* nur Shadowed */
  86.  
  87.        react();
  88.  
  89.      form_dial (2, 10,10,20,20, x,y,w,h);
  90.      form_dial (3, x,y,w,h, x,y,w,h);
  91. }
  92.  
  93.  
  94. /***** reagiert auf Benutzer-Wunsch *****/
  95. react()
  96. {
  97. int    ret,handle,i;
  98. long   len;
  99.  
  100.  
  101.        pathname[0] = (int) gemdos(0x19)+'A';
  102.  
  103.        if (index == AGAIN)
  104.               goto dosound;
  105.  
  106.  
  107.        if (speicher)
  108.             gemdos(0x49,speicher);      /* Speicher wieder freigeben */
  109.  
  110.        fsel_input(pathname,filename,&ret); /* Filenamen holen */
  111.  
  112.        if (!ret)
  113.               return;       /* Cancel */
  114.  
  115.        gemdos(0x0e,((int) pathname[0])-'A');      /* Laufwerk setzen */
  116.        set_path();   /* setzt Pfadnamen */
  117.        gemdos(0x1a,&dta);
  118.  
  119.        if(gemdos(0x4e,filename,0)) {
  120. error:        form_alert(1,"[1][Kann Song-File nicht öffnen!][ABBRUCH]");
  121.               return;
  122.        }
  123.  
  124.        len = ((long) dta.h_len)*65536+dta.l_len;  /* Länge berechnen */
  125.  
  126.        speicher = gemdos(0x48,len);       /* Speicher reservieren */
  127.        if (speicher < 0) {
  128.               form_alert(1,"[1][Zuwenig Speicherplatz!][ABBRUCH]");
  129.               speicher = 0;
  130.               return;
  131.        }
  132.  
  133.        handle = gemdos(0x3d,filename,0);  /* öffne File */
  134.        if (handle < 0) { /* Fehler beim Öffnen */
  135.               gemdos(0x3e,handle); /* schliessen */
  136.               goto error;
  137.        }
  138.  
  139.        gemdos(0x3f,handle,0x2al,speicher);
  140.        gemdos(0x3f,handle,len-0x2al,speicher);  /* Daten lesen */
  141.  
  142.        gemdos(0x3e,handle);        /* File wieder schliessen */
  143.  
  144. dosound:
  145.        len = gemdos(0x20,0l);
  146.        asm("  and.b  #$fe,$484     ");    /* Key-Click aus */
  147.        gemdos(0x20,len);
  148.  
  149.        xbios(32,speicher);  /* Musik spielen lassen */
  150.  
  151.        state(AGAIN) &= 0xf7;
  152. }
  153.  
  154.  
  155. /**** setzt Pfadnamen ****/
  156. set_path()
  157. {
  158.   register char pa;
  159.   register int i;
  160.  
  161.      i = 0;
  162.      while ( *(pathname+i))
  163.           i++;  /* Länge */
  164.  
  165.      while ( *(pathname+i) != 0x5c)
  166.           i--;  /* Bis zum letzten Backslash */
  167.  
  168.      pa = *(pathname+i);
  169.      *(pathname+i) = 0;
  170.  
  171.      gemdos(0x3b,pathname);
  172.  
  173.        *(pathname+i) = pa;
  174. }
  175.  
  176.